import { BTNode } from "./BTNode";

/**
 * [行为树]
 */
export class BehaviorTree<T = any> {

    protected _updateTime: number = 0;
    protected _runTime: number = 0;

    /** 已运行总时间(单位s) */
    get runTime() {
        return this._runTime;
    }

    constructor(
        /** 行为树根节点 */
        protected _root: BTNode<T>,
        /** 上下文作为行为树所有节点共用数据 */
        protected _ctx: T,
        /** tick周期 1/5 代表每秒执行5次tick 0代表每次update都执行tick */
        public updatePeriod = 0,
    ) {
        _root.setTree(this);
    }

    /**
     * 更新行为树，根据tick周期决定是否执行tick
     * @param dt 距离上次update的时间间隔(秒)
     */
    update(dt: number) {
        this._runTime += dt;
        if (this.updatePeriod > 0) {
            this._updateTime += dt;
            const time = this._updateTime - this.updatePeriod;
            if (time >= 0) {
                this._updateTime = time;
                this.tick();
            }
        } else {
            this.tick();
        }
    }

    /**
     * tick代表行为树运行一个周期
     * 从根节点开始逐层遍历节点 检测节点状态
     */
    tick() {
        this._root.tick(this._ctx);
    }

}